﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Entities;
using System.Windows.Forms;
using System.ComponentModel;
using Cesave.Application.Permisos.ServiceAgent;
using Cesave.Domain.Core.Entities;

namespace Cesave.Presentation.Permisos.WinForms.Client.ViewModels.Catalogs.CiclosFechas
{
	public partial class CiclosFechasViewModel
	{
		#region Private properties

		/// <summary>
		/// 
		/// </summary>
		private List<CiclosFecha> _ciclosFechas;

		/// <summary>
		/// 
		/// </summary>
		private CiclosFecha _ciclosFecha;

		#endregion

		#region Public properties

		/// <summary>
		/// 
		/// </summary>
		public List<CiclosFecha> CiclosFechas
		{
			get
			{
				return _ciclosFechas;
			}
			private set
			{
				_ciclosFechas = value;
				if (_ciclosFechas != null)
					RaisePropertyChanged("CiclosFechas");
			}
		}

		/// <summary>
		/// 
		/// </summary>
		public CiclosFecha CiclosFecha
		{
			get
			{
				return _ciclosFecha;
			}
			private set
			{
				_ciclosFecha = value;
				if (_ciclosFecha != null)
					RaisePropertyChanged("CiclosFecha");
			}
		}

		#endregion

		#region Private methods

		/// <summary>
		/// 
		/// </summary>
		private void LoadCiclosFechas()
		{
			StartWaiting();
			using (BackgroundWorker worker = new BackgroundWorker())
			{
				worker.DoWork += (sender, e) =>
				{
					using (PermisosModuleServiceWrapper service = new PermisosModuleServiceWrapper())
					{
						e.Result = service.FindCiclosFechasByJuntaAndCiclo(_pusSettings.Junta.JuntaGuid, Ciclo.CicloGuid);
					}
				};
				worker.RunWorkerCompleted += (sender, e) =>
				{
					EndWaiting();
					if (!e.Cancelled && e.Error == null)
						CiclosFechas = e.Result as List<CiclosFecha>;
					else if (e.Error != null)
						ShowMessage(e.Error.Message);
				};
				worker.WorkerSupportsCancellation = true;
				worker.RunWorkerAsync();
			}
		}

		#endregion

		#region Event methods

		/// <summary>
		/// 
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void AddNewCiclosFecha(object sender, EventArgs e)
		{
			_ciclosFechasView.ciclosFechasBindingSource.AddingNew += AddingNewCiclosFecha;
			_ciclosFechasView.ciclosFechasBindingSource.AddNew();
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void AddingNewCiclosFecha(object sender, AddingNewEventArgs e)
		{
			CiclosFecha = new CiclosFecha
			{
				CicloGuid = Ciclo.CicloGuid,
				CicloId = Ciclo.CicloId,
				FechaGuid = Guid.NewGuid(),
				FechaId = 0,
				Fin = DateTime.Now.AddDays(15),
				Inicio = DateTime.Now,
				JuntaGuid = _pusSettings.Junta.JuntaGuid,
				JuntaId = _pusSettings.Junta.JuntaId,
				Nombre = "",
				Status = true,
			};
			CiclosFecha.MarkAsAdded();
			e.NewObject = CiclosFecha;
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void SaveCiclosFechas(object sender, EventArgs e)
		{
			StartWaiting();
			using (BackgroundWorker worker = new BackgroundWorker())
			{
				worker.DoWork += (s, args) =>
				{
					using (PermisosModuleServiceWrapper service = new PermisosModuleServiceWrapper())
					{
						CiclosFechas.ForEach(f =>
						{
							if (f.ChangeTracker.State == ObjectState.Added)
								service.AddCiclosFecha(f);
							else
								service.ChangeCiclosFechas(f);
							f.AcceptChanges();
						});
					}
				};
				worker.RunWorkerCompleted += (s, args) =>
				{
					EndWaiting();
					if (args.Error != null)
						ShowMessage(args.Error.Message);
				};
				worker.WorkerSupportsCancellation = true;
				worker.RunWorkerAsync();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void SetCurrentCiclosFecha(object sender, EventArgs e)
		{
			BindingSource bindingSource = sender as BindingSource;
			if ((bindingSource != null) && (bindingSource.Current != null))
				CiclosFecha = bindingSource.Current as CiclosFecha;
		}

		/// <summary>
		/// 
		/// </summary>
		private void OnCiclosFechasPropertyChanged()
		{
			_ciclosFechasView.ciclosFechasBindingSource.DataSource = CiclosFechas;
			_ciclosFechasView.ciclosFechasBindingSource.CurrentChanged += SetCurrentCiclosFecha;
			SetCurrentCiclosFecha(_ciclosFechasView.ciclosFechasBindingSource, new EventArgs());
		}

		/// <summary>
		/// 
		/// </summary>
		private void OnCiclosFechaPropertyChanged()
		{
		}

		#endregion
	}
}